package com.mjf.scala.chapter06

/**
 * 通过静态绑定和动态绑定说明多态
 *
 *  -多态
 *      >同一个对象，多种不同形态
 *      >父类引用指向子类对象\接口指向实现类
 *      >只能调用其引用类型中定义的方法（编译看左）
 *          静态绑定（编译期绑定）：在Java语言中，在程序编译的时候，确定属性所属的类型
 *      >在运行的时候，会执行子类中覆盖的方法（运行看右）
 *          动态绑定（运行期绑定）：在程序执行的时候，看实际创建对象的；类型是什么，然后进行调用，方法属于动态绑定
 */
object Scala13_TestDynamic {
  def main(args: Array[String]): Unit = {
    val teacher: Teacher13 = new Teacher13()
    println(teacher.name)   // teacher
    teacher.hello()   // hello teacher

    // 在Scala语言中，不管是属性还是方法都是动态绑定
    val teacher1: Person13 = new Teacher13()
    println(teacher1.name)   // teacher
    teacher1.hello()  // hello teacher
//    teacher1.hi()   // 编译报错，只能调用其引用类型（Person13）中定义的方法
  }
}


class Person13 {
  val name: String = "person"

  def hello(): Unit = {
    println("hello person")
  }
}

class Teacher13 extends Person13 {

  override val name: String = "teacher"

  override def hello(): Unit = {
    println("hello teacher")
  }

  def hi(): Unit ={
    println("hi")
  }
}
